/***********************************************************************************
 * 文件名： mcu_uart.h
 * 作者： 刘言
 * 版本： 1
 * 说明：
 *      中断入口统一定义在 isr.c 中。
 * 修改记录：
 * 	2024/8/27: 初版。 刘言。
***********************************************************************************/
#ifndef _MCU_UART_H_
#define _MCU_UART_H_

#ifdef __cplusplus
 extern "C" {
#endif

#include "mcu.h"

/**
 * 初始化指定UART，将会允许外设中断（未开启NVIC，使用 NVIC_SetPriority 配置 \ NVIC_EnableIRQ 使能）。
 * 时钟通过调用 Mcu_Init 统一开启,IO口分配与配置不在这里初始化（使用Gpio_Init）。
*/
void Uart_Init();

/**
 * 写入(发送)一个字节
 * @param c 一个字节的数据、一个字符
*/
void Uart_WriteByte(u8 c);

/**
 * 【异步】写入(发送)一个字节，会自动清除TC标志，发送完毕后会产生中断TXE/TC，也可通过 Uart_GetSentFlag 查询是否发送完毕。
 * @param uart UART对象指针 USART1
 * @param c 一个字节的数据、一个字符
*/
STATIC_FORCE_IN_LINE void Uart_WriteByteAsync(u8 c)
{
    USART1->DR = c;
}

/**
 * 写入（发送）多个字节
 * @param uart UART对象指针，在配置文件中定义的各个UART名称
 * @param dat 要发的数据指针
 * @param size 要发的数据长度（字节数）
*/
void Uart_Write(const u8 *dat, size_t size);

/**
 * 读取一个字节（读取最后收到的一个字节），会自动清除RXNE标志。
 * @param uart UART对象指针，在配置文件中定义的各个UART名称
 * @return 读出的字节数据，-1表示缓存是空的，未读出任何数据。
*/
STATIC_FORCE_IN_LINE u8 Uart_ReadByte()
{
    return USART1->DR;
}


void Uart_SetBaud(u32 baud);

// 获取1个字节发送完毕标志（会自动清除标志）
// true - 发送完毕
STATIC_FORCE_IN_LINE bool Uart_GetSentFlag()
{
    return (READ_BIT(USART1->SR, USART_SR_TC) == (USART_SR_TC));
}

// 清除1个字节发送完毕标志(通常不需要调用)
STATIC_FORCE_IN_LINE void Uart_ClearSentFlag()
{
    WRITE_REG(USART1->SR, ~(USART_SR_TC));
}

// 获取1个字节接收完毕标志 RXNE
// true - 接收完毕
STATIC_FORCE_IN_LINE bool Uart_GetRecivedFlag()
{
    return (READ_BIT(USART1->SR, USART_SR_RXNE) == (USART_SR_RXNE));
}

// 清除1个字节接收完毕标志(通常不需要调用)
STATIC_FORCE_IN_LINE void Uart_ClearRecivedFlag()
{
    WRITE_REG(USART1->SR, ~(USART_SR_RXNE));
}

#ifdef __cplusplus
}
#endif

#endif

